<?php
/**
 * Date: 2024.8
 * Author: kahn
 */
namespace service\vip\payment;

use config\Payment;

class ApplepayService  extends \Service {
    private bool $sandbox;
    private string $url = 'https://buy.itunes.apple.com/verifyReceipt';
    private string $sandboxUrl = 'https://sandbox.itunes.apple.com/verifyReceipt';

    public function __construct() {
        $this->sandbox = Payment::APPLEPAY['sandbox'];
    }

    /**
     * @param $url
     * @param $receipt
     * @return mixed|null
     */
    private function _query($url, $receipt): ?array
    {
        $verify = httpPost($url, json_encode(array('receipt-data' => $receipt)));
        if(!$verify){
            return null;
        }

        return json_decode($verify,true);
    }

    /**
     * @param $receipt
     * @return array|null
     * 0     验证成功
     * 21000 App Store无法读取你提供的JSON数据
     * 21002 单据数据不符合格式
     * 21003 单据无法被验证
     * 21004 提供的共享密钥和账户的共享密钥不一致
     * 21005 单据服务器当前不可用
     * 21006 单据是有效的，但订阅服务已经过期。当收到这个信息时，解码后的收据信息也包含在返回内容中
     * 21007 单据信息是测试用（Sandbox），但却被发送到产品环境中验证
     * 21008 单据信息是产品环境中使用，但却被发送到测试环境中验证
     * 21009 内部数据访问错误。稍后再试
     * 21010 系统找不到用户帐户或用户帐户已被删除。
     */
    public function query($receipt): ?array
    {
        $requestUrl = $this->sandbox ? $this->sandboxUrl : $this->url;
        $verify = $this->_query($requestUrl, $receipt);
        \Log::info('apple query verify data: ',$verify);
        if(!$verify){
            return null;
        }
        if($verify['status'] == 21007){
            $verify = $this->_query($this->sandboxUrl, $receipt);
            \Log::info('apple query verify data, in sandbox: ',$verify);

            if(!$verify){
                return null;
            }
        }
        if($verify['status'] !== 0){
            return null;
        }

        $data = $verify['receipt']['in_app'][0];
        return [$data['transaction_id'], strtotime($data['purchase_date'])];

    }

    public function pay($sn): array
    {
        return ['sn'=>$sn];
    }

    public function notify(){

    }

}